// 遍历数组

const names = [ '卡尔·马克思', '奥斯特罗思夫斯基', '尼古拉斯·王某然', '王某然' ];

// 使用 for 循环遍历数组
for( let i = 0 ; i < names.length; i++ ){
    let name = names[i];
    console.log( name );
}

console.log( '- '.repeat(10) );

// 使用 for...in 遍历数组
for( let index in names ) {
    let element = names[ index ];
    console.log( index, element );
}

console.log( '- '.repeat(10) );

// 使用 for...of 遍历数组
for( let element of names ) {
    console.log( element );
}

console.log( '- '.repeat(10) );

// Array.prototype.forEach( callback [, thisArg] )
// 通过 forEach 函数遍历数组，并在 forEach 内调用 callback 处理每个元素
// 在 forEach 内部每遍历到一个元素就会调用一次 callback 函数，
// 因此 callback 函数本身的 return 语句对 forEach 毫无意义
names.forEach( (element, index, array) => {
    console.log(index, element, array === names );
} );

console.log( '- '.repeat(10) );

// Array.prototype.filter( callback [, thisArg] )
let arr = names.filter( e => {
    console.log( '过滤: ' , e );
    return e.includes('·');
} );
console.log( '符合过滤条件的元素组成的数组: ', arr );
console.log( '原数组: ', names );

Array.prototype.every = function(callback){
    for (let index = 0; index < this.length; index++) {
        const element = this[index];
        if( !callback(element, index , this ) ) {
            return false;
        }
    }
    return true;
}

// Array.prototype.every( callback [, thisArg] )
// 作用: 检查数组中每个元素是否都满足某个条件(这个检查条件可以在callback中实现)
// 数组中每个元素都通过 callback 函数检查返回 true 时，every才返回 true
let result = names.every( e => e.length > 2 );
console.log( result );

console.log( names.every( e => e.includes('·') ) );

// Array.prototype.some( callback [, thisArg] )
// 作用: 当数组中至少一个元素通过callback检查返回true时，some就返回true
console.log( names.some( e => e.includes('·') ) );

console.log( '= '.repeat(30) );

const students = [
    { id: 9527, name: '华安', gender: '男' },
    { id: 8526, name: '秋香', gender: '女' },
    { id: 1024, name: '华文', gender: '男' },
    { id: 2048, name: '华武', gender: '男' },
    { id: 7777, name: '武状元', gender: '男' },
    { id: 6666, name: '石榴姐', gender: '女' }
];

console.log( '遍历数组输出每个学生姓名' );
// 用 forEach 遍历 students 数组并输出每个学生的 姓名
students.forEach( stu => console.log( stu.name ) );

console.log( '所有男生' );
// 筛选 students 数组中所有男生
console.log( students.filter( stu => stu.gender === '男' ));

console.log( '所有女生' );
// 筛选 students 数组中所有女生
console.log( students.filter( stu => stu.gender === '女' ));

console.log( '是否都是男生' );
// 检擦 students 数组中是否所有学生都是男生
console.log( students.every( stu => stu.gender === '男' ) );

console.log( '学生姓名是否都是两个字' );
// 检擦 students 数组中是否所有学生的姓名都是两个字
console.log( students.every( stu => stu.name.length === 2 ) );

console.log( '是否至少一个女生' );
// 检擦 students 数组中是否至少有一个学生是女生
console.log( students.some( stu => stu.gender === '女' ) );


// 总结:
// Array.prototype.forEach(allback [, thisArg] ) 用于遍历数组
// Array.prototype.filter(allback [, thisArg] ) 用于过滤数组
// Array.prototype.every(allback [, thisArg] ) 用于检查数组元素是否都符合某个条件
// Array.prototype.some(allback [, thisArg] ) 用于检查数组中是否只要有一个元素符合某个条件